#ifndef frm_cursor_H
#define frm_cursor_H

#include "frm.h"

namespace frm { namespace cursor {

///////////////////////////////////////////////////////////////////////////////

struct TBase : public grf::TDebug
{
  virtual TBase *TBase_NewCopy() = 0;
  virtual void   TBase_Paint  () = 0;
};

///////////////////////////////////////////////////////////////////////////////

struct TCursorWin : public TBase
{
  char *Value;
  //
  TCursorWin(char       *V) { Value = V;}
  TCursorWin(TCursorWin &V) { Value = V.Value;}
  //
  virtual TBase *TBase_NewCopy() { return new TCursorWin(*this);}
  virtual void   TBase_Paint  () { ::SetCursor(::LoadCursor(NULL,Value));}
};

///////////////////////////////////////////////////////////////////////////////

struct TCursor : public grf::TDebug
{
  TCursor() { base = NULL;}
 ~TCursor() { delete base;}
  //
  bool IsNull()  { return base == NULL;}
  void SetNull() { delete base; base = NULL;}
  //
  void Set(const TBase &V);
  void Set(TCursor &V);
  void SetFromParent(TCursor &V) { if (!base) { Set(V);} }
  //
  void Paint() { if (base) { base->TBase_Paint();} }
  //
  TCursor &operator=( const TCursor &a) { Set( const_cast<TCursor&>(a) ); return *this; }
//  TCursor &operator=( const TCursor &a) { Set(a); return *this; }
private:
  TBase *base;
};

///////////////////////////////////////////////////////////////////////////////
}}

#endif
